/**
 * 防抖，支持立即执行第一次（leading）和延迟执行最后一次（trailing）
 * @param func 函数
 * @param delay 延迟时间，单位毫秒
 * @param leading 是否在第一次触发时立即执行
 * @param trailing 是否在最后一次触发后执行
 */
const debounce = (
  func,
  delay,
  leading = false,
  trailing = true
) => {
  let timer;
  let lastInvokeTime = 0; // 用来记录上次执行时间

  return (...args) => {
    const now = Date.now();
    if (leading && !timer) {
      func(...args); // 如果是 leading，立即执行
      lastInvokeTime = now; // 更新上次执行时间
    }

    clearTimeout(timer); // 清除之前的计时器

    // 如果是 trailing，设置新的定时器
    timer = setTimeout(() => {
      if (trailing && now - lastInvokeTime >= delay) {
        func(...args); // 延迟执行
      }
    }, delay);
  };
};

export default debounce;